iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
生成式 AI

打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記系列 第 13

[Day 13] 部署策略比較 — 用 FastAPI 部署自己的模型

  • 分享至 

  • xImage
  •  

完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-13


到 Day 12 為止,我們已經完成了 訓練 → 紀錄 → 分析 的流程,但如果模型只能靜靜躺在 results/ 裡,就還不算真正被使用。

推論服務(Inference Service) 是把模型從「研究產物」轉換成「可被系統調用」的關鍵。

今天的目標是用 FastAPI 部署我們訓練好的模型,讓任何人都能透過 API 輸入文字,獲得模型輸出的結果。同時,也會比較其他部署策略(Ollama、vLLM)的特色,作為未來擴展的參考。


推論服務設計思路

  • 輸入:一段文字(如影評)

  • 輸出:分類結果(正面 / 負面)、信心分數、處理延遲、基礎模型名稱

  • 特點

    • 直接讀取 results/ 裡最新或指定的 checkpoint
    • 自動偵測 CPU / MPS(Apple Silicon)運行環境
    • 支援模型熱切換,不需重啟服務

FastAPI 推論服務

本專案提供輕量級的情感分類推論服務,支援多種預訓練模型:

  • distilbert-base-uncased(英文,輕量級)
  • roberta-base(英文,高性能)
  • albert-base-v2(英文,輕量級)
  • bert-base-chinese(中文)

快速開始

  1. 啟動服務
# 使用最新實驗的模型
make serve

# 或指定特定實驗
make serve exp=default_experiment_20250911_233842
  1. 測試預測
# 檢查服務狀態
make predict-health

# 測試自訂文本
make predict-text text='This movie was great!'

# 使用預設範例
make predict-positive  # 測試正面評論
make predict-negative  # 測試負面評論

模型載入邏輯更新

為了避免手動設定模型名稱與標籤數,推論服務現在會 自動讀取實驗配置

  1. 從 config.yaml 讀取
    • 每個實驗目錄(results/{experiment_name}/)都包含 config.yaml,其中保存了:
    • 基礎模型名稱 → model.name
    • 標籤數量 → model.num_labels
  2. 自動載入模型
  3. 新流程
    • 只需指定實驗名稱,API 就會自動完成:
    • 找到 config.yaml
    • 讀取模型名稱與標籤數
    • 初始化模型與 tokenizer

回應格式

推論 API 的輸出範例如下:

{
    "label": 1,                    
    "probability": 0.9983,         
    "latency_ms": 25.4,            
    "base_model": "distilbert-base-uncased",  
    "language": "英文"             
}

注意事項

  1. 模型選擇

    • 英文文本 → 英文模型(DistilBERT / RoBERTa / ALBERT)
    • 中文文本 → 中文模型(BERT Chinese)
    • 文本語言需和模型語言匹配,否則準確率會大幅下降。
  2. 服務配置

    • 運行在 8002 端口
    • 自動偵測 MPS (Apple Silicon)CPU
    • 支援模型熱切換,不需重啟服務
  3. 路徑格式

    • 實驗目錄:results/{實驗名稱}/
    • 模型位置:artifacts/final_model/
    • 範例:results/default_experiment_20250911_233842/artifacts/final_model

延伸討論:Ollama / vLLM

雖然這一章重點是 FastAPI 部署自己訓練的模型,但還有其他值得關注的策略:

  • Ollama

    • 一行指令即可啟動大模型
    • 支援 M 系列晶片,部署超快
    • 但自訂模型支援有限(需轉換格式)
  • vLLM

    • 高效能 LLM 推理引擎(吞吐量極佳)
    • 適合部署在 A100/H100 等 GPU 伺服器
    • 在 M 系列晶片上支援有限,不適合本地開發
  • FastAPI(本專案主線)

    • 最大特色是能直接掛載 自己訓練的 checkpoint
    • 完全掌控流程,方便錯誤處理(Day 14)、版本管理(Day 15)、RBAC(Day 16)

Day 13 的核心成果是:我們完成了從 訓練 → 部署 → 推論 的完整流程,讓模型不再只是靜態的檔案,而是即時可用的服務。這一步不僅讓我們可以快速驗證模型,也讓不同的部署策略開始有了清楚的比較基準。

FastAPI 的部署方式為專案提供了最大的靈活度與一致性,同時也為後續的錯誤處理、版本管理與權限控制打下基礎。接下來,平台將正式進入「可用、可維護、可擴展」的階段。


📎 AI 協作記錄:今日開發指令

請幫我建立一個 **推理服務比較環境**,包含:

1. **FastAPI 版本 (MPS 加速)**:
   - 建立 `app/inference_api.py`,使用 Hugging Face pipeline + MPS。
   - 提供 `/generate` API,輸入 prompt,輸出生成文字。

2. **Ollama 測試**:
   - 說明如何啟動 Ollama (`ollama run mistral`)。
   - 提供 API 測試指令(curl)。

3. **壓測腳本**:
   - 提供 wrk 或 locust 測試 FastAPI (8000) 與 Ollama (11434)。
   - 收集延遲、QPS、成功率。

請幫我生成:
- `app/inference_api.py`
- 測試指令(bash)
- README.md 補充 FastAPI vs Ollama 部署與測試說明


上一篇
[Day 12] 訓練效能紀錄與分析:四個模型的比較與優化
下一篇
[Day 14] 測試驅動開發:從單元測試開始保障平台穩定性
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言